# -*- coding: utf-8 -*-
import time, sys
from django.core.management.base import BaseCommand
from django.core.exceptions import ObjectDoesNotExist
from enbook.games.models import Countries,Cities,Regions,Domains
from enbook.geo.models import GeoDb
from enbook.games import Loader

# Модуль обновляет EN-списки стран, регионов и доменов в БД. Для каждого домена выделяет его город и пытается определить координаты города.
# Сохраняет города (+их координаты) в таблице Cities 

class Command(BaseCommand):
    help = 'Updates cities, regions and domains from en.cx'

    def addCountries(self,countries):
        """
            Добавляет в БД список стран, проверяя их наличие. 
        """
        cdate = time.strftime("%Y-%m-%d %H:%M:%S")
        for c in countries:
            try:
                country = Countries.objects.get(country_id=c[2])
            except:
                country = Countries(country_id=c[2],country_name=c[1],added=cdate)
                country.save()

    def storeCity(self,city_name, countryId):
        """
            Сохраняет город в БД, пробуя определить его координаты по геобазе
        """
        lat, lng = 0, 0
        try:
            city = Cities.objects.get(city_name=city_name)
        except:
            try:
                geo = GeoDb.objects.get(geoname=city_name)
                lat, lng = geo.lat, geo.lng
            except GeoDb.DoesNotExist:
                pass
            except GeoDb.MultipleObjectsReturned:
                pass    #TODO: Научиться обрабатывать результаты множественной выборки
            country = Countries.objects.get(country_id=countryId)
            city = Cities(city_name=city_name,country=country,lat=lat, lng=lng)
            city.save()
            #print "added new city: %s" % (city_name, )

    def storeDomains(self,domains,countryId,regionId):
        """
            Сохраняет список игровых доменов в БД, обновляя уже существующие записи.
        """
        cdate = time.strftime("%Y-%m-%d %H:%M:%S")
        #print domains
        for c in domains:
            c[2] = c[2].replace('-','0')
            c[3] = c[3].replace('-','0')
            c[4] = c[4].replace('-','0')
            try:
                domain = Domains.objects.get(domain_name=c[0])
            except:
                domain = Domains(domain_name=c[0])
            domain.city_name = c[1]
            domain.country = Countries.objects.get(country_id=countryId)
    
            if regionId:
                domain.region = Regions.objects.get(region_id=regionId)
            domain.owner_id = c[5]
            domain.owner_name = c[6]
            domain.games_played = c[2]
            domain.players = c[4]
            domain.teams = c[3]
            domain.added = cdate
            domain.save()
            self.storeCity(domain.city_name, countryId)
    
    def storeRegions(self,countryId, regions):
        """
            Сохраняет список регионов в БД, обновляя существующие записи
        """
        cdate = time.strftime("%Y-%m-%d %H:%M:%S")
        for item in regions:
            item[2] = item[2].replace('-','0')
            item[3] = item[3].replace('-','0')
            item[4] = item[4].replace('-','0')
    
            country = Countries.objects.get(country_id=countryId)
            try:
                region = Regions.objects.get(region_id=item[5])
            except:
                region = Regions(region_id=item[5])
    
            region.country = country
            region.region_id = item[5]
            region.region_name=item[0]
            region.games_play = item[2] # количество сыгранных игр
            region.players = item[4]    # количество игроков в регионе
            region.teams = item[3]      # количество команд в регионе
            region.added = cdate
            region.save()
    
    def handle(self, *args, **options):
        """
            Точка входа при выполнении команды
        """
        countries = Loader.getCountriesList()   # Получим список стран с сайта ЕН
        self.addCountries(countries)               # Сохраним список стран в БД
        for (nil, cname, countryId) in countries:     # Для каждой страны получим список регионов
            regionsDomains = Loader.getRegions(countryId)
            if regionsDomains[0] == 'r':
                self.storeRegions(countryId, regionsDomains[1])        # Сохраняем список регионов
                for region in regionsDomains[1]:  # Для каждого региона, получаем список доменов
                    regionId = region[5]
                    domains = Loader.getDomainsList(countryId, regionId)
                    self.storeDomains(domains,countryId, regionId) # Сохраним список доменов в БД
            elif regionsDomains[0] == 'd':
                self.storeDomains(regionsDomains[1], countryId, None)